home *** CD-ROM | disk | FTP | other *** search
/ Aminet 30 / Aminet 30 (1999)(Schatztruhe)[!][Apr 1999].iso / Aminet / gfx / edit / Pgx_CEL_src.lha / pgx_cel_src / cel_gio.e next >
Text File  |  1999-01-09  |  3KB  |  139 lines

  1. /*
  2. ** CEL.gio - load and save Cherry KiSS CELs (truecolor + alpha) using Photogenics
  3. **
  4. ** Written by Michal Durys - misha@femina.com.pl
  5. */
  6.  
  7. OPT PREPROCESS
  8.  
  9. LIBRARY 'CEL.gio',1,0,'Loads CEL files used in kisekae sets' IS
  10.   gioInfo,
  11.   gioExamine(A0),
  12.   gioRead(A0),
  13.   gioWrite(A0),
  14.   gioSavePrefs(A0),
  15.   gioCleanUp(A0),
  16.   gioAbout(A0),
  17.   gioStartup,
  18.   gioShutDown,
  19.   gioLoadPrefs(A0)
  20.  
  21. MODULE 'dos/dos'
  22. MODULE 'tools/magicbits'
  23. MODULE '*pgs','*gio'
  24. MODULE '*kiss_files'
  25.  
  26. PROC gioInfo() IS GIOF_LOADER24 OR GIOF_SAVER24 OR GIOF_LOADFILE OR GIOF_SAVEFILE
  27. PROC gioCleanUp(g:PTR TO giodata) IS EMPTY
  28. PROC gioSavePrefs(g:PTR TO giodata) IS EMPTY
  29. PROC gioLoadPrefs(g:PTR TO giodata) IS EMPTY
  30. PROC gioStartup() IS EMPTY
  31. PROC gioShutDown() IS EMPTY
  32. PROC gioAbout(g:PTR TO giodata) IS EMPTY
  33. PROC main() IS EMPTY
  34.  
  35. PROC gioExamine(g:PTR TO giodata)
  36.   DEF h:PTR TO kiss_celfileheader
  37.   pgsbase:=g.pgsbase
  38.   dosbase:=g.dosbase
  39.   g.flags:=gioInfo()
  40.   h:=g.data
  41.   IF (h.id=KISS_ID) AND (h.mark=FILEMARK_CHERRYCEL)
  42.     g.width:=pcword(h.width)
  43.     g.height:=pcword(h.height)
  44.     g.depth:=24
  45.     g.error:=LOAD_OK
  46.   ELSE
  47.     g.error:=LOAD_WRONGTYPE
  48.   ENDIF
  49. ENDPROC g.error
  50.  
  51. PROC gioRead(g:PTR TO giodata)
  52.   DEF x,y,p:PTR TO CHAR,celbuf:PTR TO CHAR,bufpos:PTR TO LONG
  53.  
  54.   -> extract pgs library base
  55.   pgsbase:=g.pgsbase
  56.   -> shoould I Seek() file?
  57.   Seek(g.filehandle,SIZEOF kiss_celfileheader,OFFSET_BEGINNING)
  58.   celbuf:=FastNew(g.width*g.height*4)
  59.   Read(g.filehandle,celbuf,g.width*g.height*4)
  60.   bufpos:=celbuf
  61.   SetProgress('Loading CEL image...',0)
  62.   FOR y:=0 TO g.height-1
  63.     IF y AND $F = 0
  64.       IF SetProgress(0,y*100/g.height)<>1
  65.         g.error:=LOAD_ABORTED
  66.         RETURN g.error
  67.       ENDIF
  68.     ENDIF
  69.     p:=GetLine(g,y)
  70.     FOR x:=0 TO g.width-1
  71.       ^p:=^bufpos    -> strange, but it works ;)
  72.       p:=p+3
  73.       bufpos:=bufpos+4
  74.     ENDFOR
  75.     ReleaseLine(g,y)
  76.   ENDFOR
  77.   -> dispose allocated buffer
  78.   IF celbuf THEN FastDispose(celbuf,g.width*g.height*4)
  79.   g.error:=NIL
  80. ENDPROC g.error
  81.  
  82. PROC gioWrite(g:PTR TO giodata)
  83.   DEF h:PTR TO kiss_celfileheader
  84.   DEF x,y,p:PTR TO CHAR
  85.   DEF linebuf:PTR TO LONG
  86.  
  87.   -> extract pgs library base
  88.   pgsbase:=g.pgsbase
  89.   dosbase:=g.dosbase
  90.  
  91.   -> we can save only 24 bit data
  92.   IF g.depth<>24
  93.     g.error:=LOAD_WRONGTYPE
  94.     RETURN g.error
  95.   ENDIF
  96.  
  97.   -> fill header info
  98.   h:=FastNew(SIZEOF kiss_celfileheader)
  99.   h.id:=KISS_ID
  100.   h.mark:=FILEMARK_CHERRYCEL
  101.   h.width:=pcword(g.width)
  102.   h.height:=pcword(g.height)
  103.   h.xoffset:=0
  104.   h.yoffset:=0
  105.   h.bitsperpixel:=32
  106.   -> write header to file
  107.   Write(g.filehandle,h,SIZEOF kiss_celfileheader)
  108.   FastDispose(h,SIZEOF kiss_celfileheader)
  109.  
  110.   -> allocate memory for line buffer
  111.   linebuf:=FastNew(g.width*4)
  112.  
  113.   -> save image
  114.   SetProgress('Saving CEL image...',0)
  115.   FOR y:=0 TO g.height-1
  116.     IF y AND $F = 0
  117.       IF SetProgress(0,y*100/g.height)<>1
  118.         g.error:=LOAD_ABORTED
  119.         RETURN g.error
  120.       ENDIF
  121.     ENDIF
  122.     p:=GetLine(g,y)
  123.     -> fill image line buffer
  124.     FOR x:=0 TO g.width-1
  125.       linebuf[x]:=Long(p)  -> once again I don't understand why that works
  126.       p:=p+3
  127.     ENDFOR
  128.     Write(g.filehandle,linebuf,g.width*4)
  129.     ReleaseLine(g,y)
  130.   ENDFOR
  131.  
  132.   -> free memory buffer
  133.   FastDispose(linebuf,g.width*4)
  134.   -> everything went ok
  135.   g.error:=LOAD_OK
  136. ENDPROC g.error
  137.  
  138. CHAR '$VER: CEL.gio 1.0 (9.1.99)',0
  139.